﻿using System;
using UnityEngine;
using XFABManager;

namespace XFGameFramework
{

    public class EventConfig {
        public string eventName;
        public Action<object[]> callback;
        public EventConfig(string eventName, Action<object[]> callback) { 
            this.callback = callback;
            this.eventName = eventName;
        }
    }


    [DisallowMultipleComponent]
    public abstract class View : MonoBehaviour
    {
        #region 属性

        /// <summary>
        /// 唯一标识(只读)
        /// </summary>
        public int Id => GetInstanceID();

        /// <summary>
        /// 当前View所在的模块
        /// </summary>
        public Module Module { get; internal set; }

        /// <summary>
        /// 预制体名称
        /// </summary>
        internal string AssetName { get; set; }

        /// <summary>
        /// 监听的事件(如果需要监听事件,请在Awake中对该字段赋值)
        /// </summary>
        protected EventConfig[] ListenerEvents { get; set; }

        #endregion

        #region 生命周期

        protected virtual void Start() {
            // 说明 View 被创建出来了 但是没有对 module 赋值,
            // 说明不是通过我们提供的接口创建的,有可能是直接拖出来的,这种情况可以查找它的父类View 
            // 如果是直接拖拽到场景中的View，OnLoaded回调不会触发，同时module为空，如果需要，可以通过参数的形式传递
            if (Module == null && transform.parent != null )
            {
                // 尝试去父节点中查找
                View view = transform.parent.GetComponentInParent<View>();
                if (view != null && view.Module != null)
                    Module = view.Module;
                
            }
        }

        protected virtual void OnDestroy()
        {
            if (Module != null)
                ViewManager.RemoveView(Module, this);
        }

        protected virtual void OnEnable()
        {
            RegisterEvents();
        }

        protected virtual void OnDisable()
        {
            UnRegisterEvents();
        }

        #endregion

        #region 方法

        /// <summary>
        /// 关闭View(这里的关闭并不是销毁,而是放到缓存池中,所以不用担心销毁和创建的开销)
        /// </summary>
        public virtual void Close()
        {
            if (gameObject == null || gameObject.IsDestroy()) return;
            if(Module != null)
                ViewManager.RemoveView(Module, this);
            GameObjectLoader.UnLoad(gameObject);

        }


        /// <summary>
        /// 加载完成的回调(可以在当前方法中做一些数据更新的逻辑)
        /// </summary>
        /// <param name="param">加载View时传递的参数</param>
        public virtual void OnLoaded(params object[] param) 
        { 
        }

        private void RegisterEvents()
        {

            // 判断是否有需要监听的事件
            if (ListenerEvents == null || ListenerEvents.Length == 0) return;

            foreach (var item in ListenerEvents)
                EventManager.AddEvent(item.eventName, item.callback);
        }

        private void UnRegisterEvents()
        {

            if (ListenerEvents == null || ListenerEvents.Length == 0) return;

            foreach (var item in ListenerEvents)
            {
                EventManager.RemoveEvent(item.eventName,item.callback);
            }

        }

        #endregion
    }
}